package com.kaiqingsun.io;

import java.io.*;

public class CopyDirectory {
    //定义成static属性，保证在traversal中可以读取
    static File srcFile = new File("D:\\比特\\t图片");
    static File destFile = new File("D:\\比特\\网络原理\\dest");
    public static void main(String[] args) throws Exception {
        traversal(srcFile);
    }

    private static void traversal(File dirFile) throws Exception {
        File[] files =dirFile.listFiles();
        if (files==null){
            return;
        }
        for (File file : files){
            //怎么得到相对位置；利用src的绝对路径，destFile的绝对路径，file的绝对路径
//            System.out.println(srcFile.getCanonicalFile());
//            System.out.println(file.getCanonicalFile());
//            System.out.println(destFile.getCanonicalFile());
//            System.out.println("===============================");
            String srcFilePath = srcFile.getCanonicalPath();
            String filePath = file.getCanonicalPath();
            String destPath = destFile.getCanonicalPath();

            String relativePath = filePath.substring(srcFilePath.length());
            String destFilePath = destPath+relativePath;

//            System.out.println(destFilePath);
            File oneDestFile = new File(destFilePath);

            if (file.isDirectory()){
                //是目录时，直接创建目录
                oneDestFile.mkdir();//我们可以保证其父目录一定存在
                traversal(file);

            }else if (file.isFile()){
                CopyFile(file,oneDestFile);
            }
        }
    }
    public static void CopyFile(File srcFile,File destFile) throws Exception {

        //0.用于当前统计复制速度
        long startedAt =System.currentTimeMillis();//获取当前时间戳ms

        //1.准备好数据的桶
        byte[] buf = new byte[1024];

        //2.打开两个文件
        int count=0;
        try (InputStream is = new FileInputStream(srcFile)) {
            try (OutputStream os = new FileOutputStream(destFile)){
                //3.不断的用桶从is节水，倒入os中
                while (true){
                    int n = is.read(buf);
                    count+=n;
//                    System.out.printf("已经复制了 %d 字节的数据\n",count);
                    if (n==-1){
                        //全部读完了可以终止循环了
                        break;
                    }

                    //直接将读入的数据，原封不动的写入os中
                    os.write(buf,0,n);
                }

                //4.冲刷缓冲区
                os.flush();
            }
        }
        long endedAt = System.currentTimeMillis();//获取当前时间戳
        long ms = endedAt-startedAt;
        double s = ms/1000.0;
//        System.out.printf("复制共消耗了：%.3f 秒\n",s);
    }
}
